package com.example.excel.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.excel.entity.User;
import com.example.excel.repository.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 用户服务类
 * 负责生成模拟数据并保存到数据库
 * 
 * 该类主要用于演示如何生成大量测试数据，以便测试Excel导出功能
 */
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    
    @Autowired
    private UserMapper userMapper;
    
    // 姓氏列表，用于生成随机姓名
    private static final String[] SURNAMES = {
        "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈",
        "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许",
        "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏"
    };
    
    // 名字列表，用于生成随机姓名
    private static final String[] NAMES = {
        "明", "华", "强", "伟", "军", "丽", "娜", "敏", "静", "霞",
        "磊", "洋", "勇", "艳", "杰", "娟", "涛", "超", "秀英", "帆",
        "波", "刚", "琴", "芳", "建", "利", "平", "红", "斌", "雪"
    };
    
    // 邮箱后缀列表，用于生成随机邮箱
    private static final String[] EMAIL_DOMAINS = {
        "@gmail.com", "@yahoo.com", "@hotmail.com", "@163.com", "@qq.com",
        "@sina.com", "@sohu.com", "@outlook.com"
    };
    
    // 地址列表，用于生成随机地址
    private static final String[] ADDRESSES = {
        "北京市朝阳区xxx街道", "上海市浦东新区xxx路", "广州市天河区xxx大道",
        "深圳市南山区xxx社区", "杭州市西湖区xxx小区", "南京市鼓楼区xxx街道",
        "成都市锦江区xxx路", "武汉市江汉区xxx社区", "西安市雁塔区xxx小区",
        "重庆市渝中区xxx街道"
    };
    
    /**
     * 生成指定数量的用户数据并保存到数据库
     * 
     * 数据生成策略：
     * 1. 姓名：随机选择姓氏和名字组合
     * 2. 邮箱：基于姓名和序号生成
     * 3. 年龄：18-80岁之间的随机数
     * 4. 地址：从预定义地址列表中随机选择
     * 5. 创建时间：当前时间
     * 
     * 性能优化策略：
     * 1. 批量插入：每10000条数据批量插入一次数据库
     * 2. 进度提示：每处理一定数量数据打印进度信息
     * 
     * @param count 需要生成的数据量
     * @return 实际生成的数据量
     */
    public int generateUsers(int count) {
        Random random = new Random();
        // 批量插入列表，容量为10000条，避免占用过多内存
        List<User> users = new ArrayList<>(10000); 
        
        long startTime = System.currentTimeMillis();
        System.out.println("开始生成" + count + "条用户数据...");
        
        for (int i = 1; i <= count; i++) {
            User user = new User();
            
            // 生成随机姓名：姓氏 + 双字名
            String surname = SURNAMES[random.nextInt(SURNAMES.length)];
            String name = NAMES[random.nextInt(NAMES.length)] + 
                         NAMES[random.nextInt(NAMES.length)]; // 双字名
            user.setName(surname + name);
            
            // 生成随机邮箱：姓名小写 + 序号 + 随机邮箱后缀
            String email = (surname + name).toLowerCase() + i + 
                          EMAIL_DOMAINS[random.nextInt(EMAIL_DOMAINS.length)];
            user.setEmail(email);
            
            // 生成随机年龄：18-80岁之间的随机数
            user.setAge(18 + random.nextInt(63));
            
            // 生成随机地址：从预定义地址列表中随机选择
            user.setAddress(ADDRESSES[random.nextInt(ADDRESSES.length)]);
            
            // 设置创建时间：当前时间
            user.setCreateTime(LocalDateTime.now());
            
            users.add(user);
            
            // 每10000条批量插入一次数据库，或处理到最后一条数据时插入
            if (i % 10000 == 0 || i == count) {
                users.forEach(userMapper::insert);
                System.out.println("已保存 " + i + " 条数据");
                users.clear(); // 清空列表准备下一批
            }
        }
        
        long endTime = System.currentTimeMillis();
        System.out.println("生成并保存 " + count + " 条用户数据完成，耗时: " + (endTime - startTime) + " ms");
        
        return count;
    }
}